
#!/bin/bash
###############################################################################
#       脚本名称: utils_email.sh
#       功能描述: 邮箱工具函数，提供邮箱的发送和接收等功能
#       作者: 林再来
#       日期: 2025-09-30
#       版本: 1.0
#       功能:
#           1、邮箱的发送和接收
#           2、支持主送和抄送
#           3、参数校验：必填、邮箱格式、附件存在性
#       依赖(插件/命令):
#           1、bash
#           2、mail
#           3、mailx
#           4、mutt
#           5、utils_validate.sh (validate_required)
#           6、utils_file.sh (validate_file_readable)
###############################################################################

# 注意：不使用严格模式，避免影响交互式 shell

# 引入通用校验库（用于 validate_required）
__SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [[ -f "${__SCRIPT_DIR}/utils_validate.sh" ]]; then
    . "${__SCRIPT_DIR}/utils_validate.sh"
fi

# 引入文件工具库（用于 validate_file_readable）
if [[ -f "${__SCRIPT_DIR}/utils_file.sh" ]]; then
    . "${__SCRIPT_DIR}/utils_file.sh"
fi

###############################################################################
# 邮箱校验函数
###############################################################################

# 函数: 校验邮箱格式(简单正则, 覆盖常见场景)
# 参数: $1 - 邮箱地址; $2 - 参数名称
# 返回: 0-通过, 64-参数错误
# 说明: 支持逗号分隔的多邮箱列表
function validate_email() {
    local email="$1"
    local name="$2"

    # 允许逗号分隔的多邮箱列表, 逐个校验
    IFS=',' read -r -a __emails <<< "$email"
    local item
    for item in "${__emails[@]}"; do
        local trimmed="${item// /}"
        [[ -z "$trimmed" ]] && continue
        if [[ ! "$trimmed" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ ]]; then
            printf "%s\n" "错误: 邮箱格式不正确(${name}): ${trimmed}" >&2
            return 64
        fi
    done
    return 0
}

###############################################################################
# 邮件发送和接收函数
###############################################################################

# 配置SMTP参数(需替换为实际值)
SMTP_SERVER="smtp.example.com"
SMTP_PORT="587"
SENDER="your_email@example.com"
AUTH_PASS="your_password_or_auth_code"

# 发送邮件函数(支持主送和抄送)
function send_email() {
    local to=$1
    local cc=${2:-}
    local subject=${3:-}
    local body=${4:-}
    local attachment=${5:-}

    # 参数与格式校验（若校验库存在则使用）
    if declare -F validate_required >/dev/null 2>&1; then
        validate_required "$to" "to" || return $?
        validate_required "$subject" "subject" || return $?
        validate_required "$body" "body" || return $?
    fi
    if declare -F validate_email >/dev/null 2>&1; then
        validate_email "$to" "to" || return $?
        [[ -n "$cc" ]] && validate_email "$cc" "cc" || true
    fi
    if declare -F validate_file_readable >/dev/null 2>&1; then
        [[ -n "$attachment" ]] && validate_file_readable "$attachment" "attachment" || true
    fi

    # 构建邮件头
    local headers="To: $to\n"
    [[ -n "$cc" ]] && headers+="Cc: $cc\n"
    headers+="From: $SENDER\nSubject: $subject\n"

    if [[ -n "$attachment" ]]; then
        # 使用 mutt 发送带附件，抄送使用 -c
        if [[ -n "$cc" ]]; then
            echo -e "$headers\n$body" | mutt -e "set content_type=text/html" -a "$attachment" -c "$cc" -- "$to"
        else
            echo -e "$headers\n$body" | mutt -e "set content_type=text/html" -a "$attachment" -- "$to"
        fi
    else
        # 使用 mailx 发送普通邮件
        if [[ -n "$cc" ]]; then
            echo -e "$headers\n$body" | mailx -v -s "$subject" \
                -S smtp="smtp://$SMTP_SERVER:$SMTP_PORT" \
                -S smtp-use-starttls \
                -S smtp-auth=login \
                -S smtp-auth-user="$SENDER" \
                -S smtp-auth-password="$AUTH_PASS" \
                -S from="$SENDER" \
                -c "$cc" "$to"
        else
            echo -e "$headers\n$body" | mailx -v -s "$subject" \
                -S smtp="smtp://$SMTP_SERVER:$SMTP_PORT" \
                -S smtp-use-starttls \
                -S smtp-auth=login \
                -S smtp-auth-user="$SENDER" \
                -S smtp-auth-password="$AUTH_PASS" \
                -S from="$SENDER" "$to"
        fi
    fi
}

# 接收邮件函数(支持过滤抄送邮件)
function receive_email() {
    local action=$1
    local filter=$2
    
    case $action in
        list)
            if [ "$filter" == "cc" ]; then
                mail -H | grep -i "Cc:"
            else
                mail -H
            fi
            ;;
        read)
            mail -f /var/mail/$(whoami) -N $2
            ;;
        *)
            echo "Usage: $0 receive [list [cc]|read ID]"
            ;;
    esac
}

# 主逻辑
case $1 in
    send)
        shift
        send_email "$@"
        ;;
    receive)
        shift
        receive_email "$@"
        ;;
    *)
        echo "Usage:"
        echo " 发送邮件: $0 send 主送地址 抄送地址 主题 内容 [附件路径]"
        echo " 接收邮件: $0 receive [list [cc]|read ID]"
        ;;
esac

